package com.ethan.json;

import com.ethan.json.pojo.TgqDbInfo;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;

/**
 * @author ethan
 * create 2018-06-26 下午6:21
 * desc
 **/
public class JSONTools {
    private static final Logger logger = LoggerFactory.getLogger(JSONTools.class);

    private static final ObjectMapper mapper = new ObjectMapper();

    static {
        mapper.disable(SerializationFeature.INDENT_OUTPUT);
        mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
        mapper.configure(JsonParser.Feature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER, true);
        mapper.configure(JsonParser.Feature.ALLOW_COMMENTS, true);
        mapper.configure(JsonParser.Feature.ALLOW_NON_NUMERIC_NUMBERS, true);
        mapper.configure(JsonParser.Feature.ALLOW_NUMERIC_LEADING_ZEROS, true);
        mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
        mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true);
        mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
    }

    private JSONTools() {
    }

    public static ObjectMapper getMapper() {
        return mapper;
    }

    public static String serialize(Object data) {
        try {
            if (null == data) {
                return "";
            }
            return mapper.writeValueAsString(data);
        } catch (IOException e) {
            logger.error("serialize data error", e);
            return null;
        }
    }

    public static <T> T deSerialize(String content, Class<T> clazz) {
        try {
            return mapper.readValue(content, clazz);
        } catch (IOException e) {
            logger.error("deserialize object error: {}", content, e);
            return null;
        }
    }

    public static <T> T convertValue(Object object, Class<T> clazz) {
        try {
            return mapper.convertValue(object, clazz);
        } catch (Exception e) {
            logger.error("convertTgqResult object error: {}", object, e);
            return null;
        }
    }

    public static void main(String[] args){
        String json ="{\"timePointCharges\":[{\"time\":0,\"timeText\":\"起飞前\",\"returnFee\":95,\"changeFee\":0},{\"time\":-2147483648,\"timeText\":\"起飞后\",\"returnFee\":143,\"changeFee\":95}],\"cTimePointCharges\":[{\"time\":4,\"timeText\":\"起飞前4小时之前\",\"returnFee\":48,\"changeFee\":24},{\"time\":-2147483648,\"timeText\":\"起飞前4小时之后\",\"returnFee\":95,\"changeFee\":48}],\"tgqFrom\":1,\"cTgqFrom\":13,\"returnRule\":\"10-0-15\",\"cReturnRule\":\"10-4-20\",\"returnText\":\"航班起飞前,退票手续费为95元;航班起飞后,退票手续费为143元\",\"cReturnText\":\"航班起飞前4小时之前,退票手续费为48元;航班起飞前4小时之后,退票手续费为95元\",\"changeRule\":\"0-0-10\",\"cChangeRule\":\"5-4-10\",\"changeText\":\"航班起飞前,改期手续费为0元;航班起飞后,改期手续费为95元\",\"cChangeText\":\"航班起飞前4小时之前,改期手续费为24元;航班起飞前4小时之后,改期手续费为48元\",\"childtgqText\":\"退改签规则以航空公司最新规定为准，可咨询客服电话（95117）\",\"allowChange\":false,\"cAllowChange\":false,\"tgqText\":\"同舱更改条件：航班起飞前,改期手续费为0元;航班起飞后,改期手续费为95元<br />退票条件：航班起飞前,退票手续费为95元;航班起飞后,退票手续费为143元<br />签转条件：不可签转\",\"cTgqText\":\"同舱更改条件：航班起飞前4小时之前,改期手续费为24元;航班起飞前4小时之后,改期手续费为48元<br />退票条件：航班起飞前4小时之前,退票手续费为48元;航班起飞前4小时之后,退票手续费为95元<br />签转条件：不可签转\",\"babyTgqText\":\"退改签规则以航空公司最新规定为准，可咨询客服电话（95117）\",\"signText\":\"不可签转\",\"cSignText\":\"不可签转\",\"viewType\":1,\"cViewType\":1,\"hasTime\":true,\"cHasTime\":true,\"canChange\":true,\"cCanChange\":true,\"canRefund\":true,\"cCanRefund\":true,\"basePrice\":950.0,\"cBasePrice\":475.0,\"isAirlineChildTgq\":false,\"tgqCabin\":\"Y\",\"cTgqCabin\":\"Y\",\"tgqPercentText\":\"同舱更改条件：航班起飞前，改期手续费为票面价的0%；航班起飞后，改期手续费为票面价的10%<br />退票条件：航班起飞前，退票手续费为票面价的10%；航班起飞后，退票手续费为票面价的15%<br />签转条件：不可签转\",\"cTgqPercentText\":\"同舱更改条件：航班起飞前4小时之前，改期手续费为票面价的5%；航班起飞前4小时之后，改期手续费为票面价的10%<br />退票条件：航班起飞前4小时之前，退票手续费为票面价的10%；航班起飞前4小时之后，退票手续费为票面价的20%<br />签转条件：不可签转\",\"tgqProduct\":\"LimitFlight\",\"cTgqProduct\":\"CHILD_TGQ\",\"qtraceid\":null,\"ceilDiscount\":9.0,\"cCeilDiscount\":9.0,\"useInOrder\":false,\"extMap\":{\"CABIN_CHANGE_EXPLAIN\":\"申请改签，同舱位变更时，如变更前后的票面价之间存在差价，则补足差价；如同时存在改期手续费和升舱费，则需同时收取改期手续费和舱位差额。已办理完变更、签转的客票，后续再发生退、改、签业务时，所收取的变更费一律不再退回。\"},\"airlineTgq\":true,\"airlineChildTgq\":false,\"ctgqFrom\":13,\"creturnRule\":\"10-4-20\",\"creturnText\":\"航班起飞前4小时之前,退票手续费为48元;航班起飞前4小时之后,退票手续费为95元\",\"cchangeRule\":\"5-4-10\",\"cchangeText\":\"航班起飞前4小时之前,改期手续费为24元;航班起飞前4小时之后,改期手续费为48元\",\"callowChange\":false,\"ctgqText\":\"同舱更改条件：航班起飞前4小时之前,改期手续费为24元;航班起飞前4小时之后,改期手续费为48元<br />退票条件：航班起飞前4小时之前,退票手续费为48元;航班起飞前4小时之后,退票手续费为95元<br />签转条件：不可签转\",\"csignText\":\"不可签转\",\"cviewType\":1,\"chasTime\":true,\"ccanChange\":true,\"ccanRefund\":true,\"cbasePrice\":475.0,\"ctgqCabin\":\"Y\",\"ctgqPercentText\":\"同舱更改条件：航班起飞前4小时之前，改期手续费为票面价的5%；航班起飞前4小时之后，改期手续费为票面价的10%<br />退票条件：航班起飞前4小时之前，退票手续费为票面价的10%；航班起飞前4小时之后，退票手续费为票面价的20%<br />签转条件：不可签转\",\"ctgqProduct\":\"CHILD_TGQ\",\"cceilDiscount\":9.0}";

        String json1 ="{\"airlineChildTgq\":false,\"airlineTgq\":true,\"allowChange\":false,\"babyTgqText\":\"退改签规则以航空公司最新规定为准，可咨询客服电话（95117）\",\"basePrice\":10,\"cAllowChange\":false,\"cBasePrice\":9,\"cCanChange\":true,\"cCanRefund\":true,\"cCeilDiscount\":9,\"cChangeRule\":\"5-4-10\",\"cChangeText\":\"航班起飞前4小时之前,改期手续费为24元;航班起飞前4小时之后,改期手续费为48元\",\"cHasTime\":true,\"cReturnRule\":\"10-4-20\",\"cReturnText\":\"航班起飞前4小时之前,退票手续费为48元;航班起飞前4小时之后,退票手续费为95元\",\"cSignText\":\"不可签转\",\"cTgqCabin\":\"Y\",\"cTgqFrom\":13,\"cTgqPercentText\":\"同舱更改条件：航班起飞前4小时之前，改期手续费为票面价的5%；航班起飞前4小时之后，改期手续费为票面价的10%<br />退票条件：航班起飞前4小时之前，退票手续费为票面价的10%；航班起飞前4小时之后，退票手续费为票面价的20%<br />签转条件：不可签转\",\"cTgqProduct\":\"CHILD_TGQ\",\"cTgqText\":\"同舱更改条件：航班起飞前4小时之前,改期手续费为24元;航班起飞前4小时之后,改期手续费为48元<br />退票条件：航班起飞前4小时之前,退票手续费为48元;航班起飞前4小时之后,退票手续费为95元<br />签转条件：不可签转\",\"cTimePointCharges\":[{\"changeFee\":10,\"returnFee\":20,\"time\":4,\"timeText\":\"起飞前4小时之前\"},{\"changeFee\":48,\"returnFee\":95,\"time\":-2147483648,\"timeText\":\"起飞前4小时之后\"}],\"cViewType\":1,\"canChange\":true,\"canRefund\":true,\"ceilDiscount\":9,\"changeRule\":\"0-0-10\",\"changeText\":\"航班起飞前,改期手续费为0元;航班起飞后,改期手续费为95元\",\"childtgqText\":\"退改签规则以航空公司最新规定为准，可咨询客服电话（95117）\",\"hasTime\":true,\"lastUpdateTime\":1530007883177,\"returnRule\":\"10-0-15\",\"returnText\":\"航班起飞前,退票手续费为95元;航班起飞后,退票手续费为143元\",\"signText\":\"不可签转\",\"tgqCabin\":\"Y\",\"tgqFrom\":1,\"tgqPercentText\":\"同舱更改条件：航班起飞前，改期手续费为票面价的0%；航班起飞后，改期手续费为票面价的10%<br />退票条件：航班起飞前，退票手续费为票面价的10%；航班起飞后，退票手续费为票面价的15%<br />签转条件：不可签转\",\"tgqProduct\":\"LimitFlight\",\"tgqText\":\"同舱更改条件：航班起飞前,改期手续费为0元;航班起飞后,改期手续费为95元<br />退票条件：航班起飞前,退票手续费为95元;航班起飞后,退票手续费为143元<br />签转条件：不可签转\",\"timePointCharges\":[{\"changeFee\":10,\"returnFee\":20,\"time\":0,\"timeText\":\"起飞前\"},{\"changeFee\":95,\"returnFee\":143,\"time\":-2147483648,\"timeText\":\"起飞后\"}],\"viewType\":1}";

        TgqDbInfo tgqDbInfo = deSerialize(json, TgqDbInfo.class);

        TgqDbInfo tgqDbInfo1 = deSerialize(json1, TgqDbInfo.class);

        String a="";

    }
}
